#include "gskvulkanpushconstantsprivate.h"
-#include <math.h>
+#include "gskroundedrectprivate.h"
void
gsk_vulkan_push_constants_init (GskVulkanPushConstants *constants,
- const graphene_matrix_t *mvp)
+ const graphene_matrix_t *mvp,
+ const graphene_rect_t *viewport)
{
graphene_matrix_init_from_matrix (&constants->mvp, mvp);
+ gsk_vulkan_clip_init_empty (&constants->clip, viewport);
}
void
*self = *src;
}
-void
-gsk_vulkan_push_constants_init_transform (GskVulkanPushConstants *self,
- const GskVulkanPushConstants *src,
- const graphene_matrix_t *transform)
+gboolean
+gsk_vulkan_push_constants_transform (GskVulkanPushConstants *self,
+ const GskVulkanPushConstants *src,
+ const graphene_matrix_t *transform,
+ const graphene_rect_t *viewport)
{
+ if (!gsk_vulkan_clip_transform (&self->clip, &src->clip, transform, viewport))
+ return FALSE;
+
graphene_matrix_multiply (transform, &src->mvp, &self->mvp);
+ return TRUE;
+}
+
+gboolean
+gsk_vulkan_push_constants_intersect_rect (GskVulkanPushConstants *self,
+ const GskVulkanPushConstants *src,
+ const graphene_rect_t *rect)
+{
+ if (!gsk_vulkan_clip_intersect_rect (&self->clip, &src->clip, rect))
+ return FALSE;
+
+ graphene_matrix_init_from_matrix (&self->mvp, &src->mvp);
+ return TRUE;
+}
+
+gboolean
+gsk_vulkan_push_constants_intersect_rounded (GskVulkanPushConstants *self,
+ const GskVulkanPushConstants *src,
+ const GskRoundedRect *rect)
+{
+ if (!gsk_vulkan_clip_intersect_rounded_rect (&self->clip, &src->clip, rect))
+ return FALSE;
+
+ graphene_matrix_init_from_matrix (&self->mvp, &src->mvp);
+ return TRUE;
}
static void
const GskVulkanPushConstants *self)
{
graphene_matrix_to_float (&self->mvp, wire->vertex.mvp);
+ gsk_rounded_rect_to_float (&self->clip.rect, wire->vertex.clip);
}
void
#include <gdk/gdk.h>
#include <graphene.h>
+#include <gsk/gskvulkanclipprivate.h>
G_BEGIN_DECLS
struct _GskVulkanPushConstants
{
graphene_matrix_t mvp;
+ GskVulkanClip clip;
};
struct _GskVulkanPushConstantsWire
{
struct {
float mvp[16];
+ float clip[12];
} vertex;
#if 0
struct {
uint32_t gst_vulkan_push_constants_get_range_count (void) G_GNUC_PURE;
void gsk_vulkan_push_constants_init (GskVulkanPushConstants *constants,
- const graphene_matrix_t *mvp);
+ const graphene_matrix_t *mvp,
+ const graphene_rect_t *viewport);
void gsk_vulkan_push_constants_init_copy (GskVulkanPushConstants *self,
const GskVulkanPushConstants *src);
-void gsk_vulkan_push_constants_init_transform (GskVulkanPushConstants *self,
+
+gboolean gsk_vulkan_push_constants_transform (GskVulkanPushConstants *self,
+ const GskVulkanPushConstants *src,
+ const graphene_matrix_t *transform,
+ const graphene_rect_t *viewport);
+gboolean gsk_vulkan_push_constants_intersect_rect (GskVulkanPushConstants *self,
+ const GskVulkanPushConstants *src,
+ const graphene_rect_t *rect);
+gboolean gsk_vulkan_push_constants_intersect_rounded (GskVulkanPushConstants *self,
const GskVulkanPushConstants *src,
- const graphene_matrix_t *transform);
+ const GskRoundedRect *rect);
void gsk_vulkan_push_constants_push_vertex (const GskVulkanPushConstants *self,
VkCommandBuffer command_buffer,
gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self,
GskVulkanRender *render,
const GskVulkanPushConstants *constants,
- const GskVulkanClip *clip,
GskRenderNode *node)
{
GskVulkanOp op = {
case GSK_CAIRO_NODE:
if (gsk_cairo_node_get_surface (node) == NULL)
return;
- if (!gsk_vulkan_clip_contains_rect (clip, &node->bounds))
- FALLBACK ("Cairo nodes can't deal with clip type %u\n", clip->type);
+ if (!gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
+ FALLBACK ("Cairo nodes can't deal with clip type %u\n", constants->clip.type);
op.type = GSK_VULKAN_OP_SURFACE;
op.render.pipeline = gsk_vulkan_render_get_pipeline (render, GSK_VULKAN_PIPELINE_BLIT);
g_array_append_val (self->render_ops, op);
return;
case GSK_TEXTURE_NODE:
- if (!gsk_vulkan_clip_contains_rect (clip, &node->bounds))
- FALLBACK ("Texture nodes can't deal with clip type %u\n", clip->type);
+ if (!gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
+ FALLBACK ("Texture nodes can't deal with clip type %u\n", constants->clip.type);
op.type = GSK_VULKAN_OP_TEXTURE;
op.render.pipeline = gsk_vulkan_render_get_pipeline (render, GSK_VULKAN_PIPELINE_BLIT);
g_array_append_val (self->render_ops, op);
return;
case GSK_COLOR_NODE:
- if (!gsk_vulkan_clip_contains_rect (clip, &node->bounds))
- FALLBACK ("Color nodes can't deal with clip type %u\n", clip->type);
+ if (!gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
+ FALLBACK ("Color nodes can't deal with clip type %u\n", constants->clip.type);
op.type = GSK_VULKAN_OP_COLOR;
op.render.pipeline = gsk_vulkan_render_get_pipeline (render, GSK_VULKAN_PIPELINE_COLOR);
g_array_append_val (self->render_ops, op);
for (i = 0; i < gsk_container_node_get_n_children (node); i++)
{
- gsk_vulkan_render_pass_add_node (self, render, constants, clip, gsk_container_node_get_child (node, i));
+ gsk_vulkan_render_pass_add_node (self, render, constants, gsk_container_node_get_child (node, i));
}
}
return;
case GSK_TRANSFORM_NODE:
{
graphene_matrix_t transform;
- GskVulkanClip new_clip;
- graphene_rect_t rect;
+ GskRenderNode *child;
+#if 0
if (!gsk_vulkan_clip_contains_rect (clip, &node->bounds))
FALLBACK ("Transform nodes can't deal with clip type %u\n", clip->type);
+#endif
gsk_transform_node_get_transform (node, &transform);
+ child = gsk_transform_node_get_child (node);
+ if (!gsk_vulkan_push_constants_transform (&op.constants.constants, constants, &transform, &child->bounds))
+ FALLBACK ("Transform nodes can't deal with clip type %u\n", constants->clip.type);
op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
- gsk_vulkan_push_constants_init_transform (&op.constants.constants, constants, &transform);
g_array_append_val (self->render_ops, op);
- graphene_matrix_transform_bounds (&transform, &clip->rect.bounds, &rect);
- gsk_vulkan_clip_init_empty (&new_clip, &rect);
-
- gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, &new_clip, gsk_transform_node_get_child (node));
+ gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, child);
gsk_vulkan_push_constants_init_copy (&op.constants.constants, constants);
g_array_append_val (self->render_ops, op);
}
case GSK_CLIP_NODE:
{
- GskVulkanClip new_clip;
-
- if (!gsk_vulkan_clip_intersect_rect (&new_clip, clip, gsk_clip_node_peek_clip (node)))
- FALLBACK ("Failed to find intersection between clip of type %u and rectangle\n", clip->type);
- if (new_clip.type == GSK_VULKAN_CLIP_ALL_CLIPPED)
+ if (!gsk_vulkan_push_constants_intersect_rect (&op.constants.constants, constants, gsk_clip_node_peek_clip (node)))
+ FALLBACK ("Failed to find intersection between clip of type %u and rectangle\n", constants->clip.type);
+ if (&op.constants.constants.clip.type == GSK_VULKAN_CLIP_ALL_CLIPPED)
return;
- gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, &new_clip, gsk_clip_node_get_child (node));
+ op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
+ g_array_append_val (self->render_ops, op);
+
+ gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, gsk_clip_node_get_child (node));
+
+ gsk_vulkan_push_constants_init_copy (&op.constants.constants, constants);
+ g_array_append_val (self->render_ops, op);
}
return;
case GSK_ROUNDED_CLIP_NODE:
{
- GskVulkanClip new_clip;
-
- if (!gsk_vulkan_clip_intersect_rounded_rect (&new_clip, clip, gsk_rounded_clip_node_peek_clip (node)))
- FALLBACK ("Failed to find intersection between clip of type %u and rounded rectangle\n", clip->type);
- if (new_clip.type == GSK_VULKAN_CLIP_ALL_CLIPPED)
+ if (!gsk_vulkan_push_constants_intersect_rounded (&op.constants.constants,
+ constants,
+ gsk_rounded_clip_node_peek_clip (node)))
+ FALLBACK ("Failed to find intersection between clip of type %u and rounded rectangle\n", constants->clip.type);
+ if (&op.constants.constants.clip.type == GSK_VULKAN_CLIP_ALL_CLIPPED)
return;
- gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, &new_clip, gsk_rounded_clip_node_get_child (node));
+ op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
+ g_array_append_val (self->render_ops, op);
+
+ gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, gsk_rounded_clip_node_get_child (node));
+
+ gsk_vulkan_push_constants_init_copy (&op.constants.constants, constants);
+ g_array_append_val (self->render_ops, op);
}
return;
}
return;
fallback:
- switch (clip->type)
+ switch (constants->clip.type)
{
case GSK_VULKAN_CLIP_NONE:
op.type = GSK_VULKAN_OP_FALLBACK;
break;
case GSK_VULKAN_CLIP_RECT:
op.type = GSK_VULKAN_OP_FALLBACK_CLIP;
- gsk_rounded_rect_init_copy (&op.render.clip, &clip->rect);
+ gsk_rounded_rect_init_copy (&op.render.clip, &constants->clip.rect);
break;
case GSK_VULKAN_CLIP_ROUNDED_CIRCULAR:
case GSK_VULKAN_CLIP_ROUNDED:
op.type = GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP;
- gsk_rounded_rect_init_copy (&op.render.clip, &clip->rect);
+ gsk_rounded_rect_init_copy (&op.render.clip, &constants->clip.rect);
break;
case GSK_VULKAN_CLIP_ALL_CLIPPED:
default:
GskRenderNode *node)
{
GskVulkanOp op = { 0, };
- GskVulkanClip clip;
op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
- gsk_vulkan_push_constants_init (&op.constants.constants, mvp);
+ gsk_vulkan_push_constants_init (&op.constants.constants, mvp, viewport);
g_array_append_val (self->render_ops, op);
- gsk_vulkan_clip_init_empty (&clip, viewport);
-
- gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, &clip, node);
+ gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, node);
}
static void